import pandas as pd

df = pd.DataFrame(data={
    '学号': ['x1', 'x2', 'x3', 'x4', 'x5'],
    '班级': ['1班', '1班', '1班', '2班', '2班'],
    '姓名': ['张三', '李四', '王五', '韩六', '赵七'],
    '性别': ['男', '男', '男', '女', '女'],
    '身高': [177, 151, 167, 175, 153],
    '语文成绩': [92, 84, 80, 77, 87],
    '学分': [1.5, 2.3, 3.2, 1.2, 1.8],
    '日期': ['2019/3/23', '2019/3/24', '2019/3/25', '2019/3/26', '2019/3/27']
})

# 按照班级和性别分组，统计每个分组的人数
df.groupby(by=['班级', '性别'], as_index=False)['学号'].count()
# 输出
#    班级 性别  学号
# 0  1班  男   3
# 1  2班  女   2

# 按照班级和性别分组，统计每个组的成绩平均分
df.groupby(by=['班级', '性别'], as_index=False)['语文成绩'].mean()
# 输出
#    班级 性别  语文成绩
# 0  1班  男  85.333333
# 1  2班  女  82.000000

# 按照班级和性别分组，统计每个组的成绩总分
df.groupby(by=['班级', '性别'], as_index=False)['语文成绩'].sum()
# 输出
#    班级 性别  语文成绩
# 0  1班  男   256
# 1  2班  女   164

# 按照班级分组,对组内学生按成绩排序
rank = df.groupby(by=['班级'], as_index=False)['语文成绩'].rank()
df['排名'] = rank  # 将排名信息添加到原来的DataFrame中


# 输出
#    学号  班级  姓名 性别   身高  语文成绩   学分 日期   排名
# 0  x1  1班  张三  男  177    92  1.5  2019/3/23  3.0
# 1  x2  1班  李四  男  151    84  2.3  2019/3/24  2.0
# 2  x3  1班  王五  男  167    80  3.2  2019/3/25  1.0
# 3  x4  2班  韩六  女  175    77  1.2  2019/3/26  1.0
# 4  x5  2班  赵七  女  153    87  1.8  2019/3/27  2.0

# 对每个分组使用自定义函数
# agg 或 apply 函数
def myfunc(series):
    return '最大值是：' + str(series.max())


df.groupby(by=['班级', '性别'], as_index=False)['语文成绩'].agg(myfunc)
#    班级 性别     语文成绩
# 0  1班  男  最大值是：92
# 1  2班  女  最大值是：87

df.groupby(by=['班级', '性别'], as_index=False)['语文成绩'].apply(myfunc)
# 班级  性别
# 1班  男     最大值是：92
# 2班  女     最大值是：87
